/**
 * 测试机型： 
 *      型号：MI6
 *      安卓：9
 */
// 日志记录器
let useFloatyWinLogger = false;
function Logger(name) {
    this.name = name;
    const w = floaty.rawWindow(
        <frame gravity="center">
            <text id="console" typeface="monospace"></text>
        </frame>
    );
    w.setSize(-1, -1);
    w.setTouchable(false);

    this.log = function(msg) {
        console.log("【%s】: %s", this.name, msg);
        if (useFloatyWinLogger) {
            w.console.append("【" + this.name + "】: " + msg + "\n");
        }
    }
    this.log('开始');
}
// 京东金融
function Jdjr(appIndex) {
    // 第几个双开应用, 从1开始
    this.appIndex = appIndex;
    // 执行入口
    this.start = function() {
        // 每30秒点亮屏幕，如果自动锁屏时间小于半分钟，则需要调小这里的点亮间隔时间
        let keepScreenDimTask = threads.start(function() {
            setInterval(() => {
                click(0, device.height);
            }, 30000);
        });
        this.openApp();  // 唤起app
        this.openSignPage();    // 打开签到页面
        this.sign();    // 签到
        this.getSignBean("众筹送京豆");
        this.getSignBean("浏览送京豆");
        this.getSignBean("免费领京豆");
        this.getSignBean("天天赚京豆");
        this.openMakeMoneyPage();
        this.makeMoneySign();
        // this.getMakeMoneyBean("逛故宫-领京豆", "逛故宫 有好礼"); // 任务已不存在
        this.getMakeMoneyBean("分期免息-领京豆", "分期不吃土，免息享购物");
        this.getMakeMoneyBean("9块9-领京豆", "浏览商品，热销爆款9.9包邮");
        this.getMakeMoneyBean("精选-领京豆", "好物精选，低价秒不停");
        this.getMakeMoneyBean("众筹-领京豆", "京东众筹：为每个创新点赞");
        this.getMakeMoneyBean("爆款-领京豆", "超值爆款 单单有优惠");
        // this.getMakeMoneyBean("看文章-领京豆", "认真浏览 3 篇文章");  // 任务已不存在
        this.getGameSignBean();
        // app挂后台，由系统省电机制控制存活
        home();
        keepScreenDimTask.interrupt();
        console.log("结束");
    }
    // 根据字符串查找控件， 默认超时timeout=0
    function findOneByStr(str, timeout) {
        timeout = timeout || 0;
        let widget = null;
        let isTimeout = false;    // 是否超时
        let endTime = (timeout > 0) ? (new Date().getTime() + timeout) : -1;   // 结束时间
        do {
            widget = text(str).findOne(250) || desc(str).findOne(250);
            if (widget) {
                return widget;
            }
            isTimeout = (timeout <= 0) ? false : (new Date().getTime() - endTime > 0);
        } while (!isTimeout || widget != null);
    }
    // 根据字符串查找控件， 默认超时timeout=0
    function findOneByStrStartsWith(str, timeout) {
        timeout = timeout || 0;
        let widget = null;
        let isTimeout = false;    // 是否超时
        let endTime = (timeout > 0) ? (new Date().getTime() + timeout) : -1;   // 结束时间
        do {
            widget = textStartsWith(str).findOne(250) || descStartsWith(str).findOne(250);
            if (widget) {
                return widget;
            }
            isTimeout = (timeout <= 0) ? false : (new Date().getTime() - endTime > 0);
        } while (!isTimeout || widget != null);
    }
    // 退回上一页
    this.backPage = function(logger) {
        back();
        if (logger) {
            logger.log("返回上一页");
        }
        sleep(2000);
    }
    // 刷新页面
    function freshPage(logger) {
    	let btn = boundsContains(1000, 200, 1080, 222).find();
	    let size = btn.size();
        btn[size-1].click();
        sleep(500)
        btn = id("tv_platform_text").className("android.widget.TextView").text("刷新").findOne();
        let b = btn.bounds();
        click(b.centerX(), b.top - 100);
        if (logger) {
            logger.log('刷新页面');
        }
        // 等待刷新完成
        sleep(3000);
        id("common_webview_navbar_left").findOne(2000);
    }
    // 等待签到页面加载完
    function waitForSignPageLoaded(logger) {
        findOneByStr("精选福利");
        sleep(1500);
        if (logger) {
            logger.log("签到页面加载完成");
        }
    }
    // 等待赚钱页面加载完成
    function waitForMakeMoneyPageLoaded(logger) {
        findOneByStr("赚京豆");
        if (logger) {
            logger.log("赚钱页面加载完成");
        }        
    }
    // 打开京东金融
    this.openApp = function() {
        const appName = "京东金融";
        const logger = new Logger(this.appIndex ? 
            ('打开第' + this.appIndex + '个' + appName) : ('打开' + appName));
        let targetPackageName = getPackageName(appName);
        context.startActivity(app.intent({
            action: "VIEW",
            className: "com.jd.jrapp.bm.mainbox.main.MainActivity",
            packageName: targetPackageName
          }).setFlags(335544320));
        logger.log("启动App");
        sleep(2000);
        if (this.appIndex) {
            while (!text("请选择要使用的应用").findOnce()) {
                logger.log("当前是【" + getAppName(currentPackage()) + "】界面, 等待唤起双开应用选择界面...");
                sleep(3000);
                continue;
            }
            sleep(1000);
            let btn = text("请选择要使用的应用").findOnce();
            let b = btn.bounds();
            // 点击下面图标，通过id、desc、text查询在不同时间段会出现不一样结果
            click(device.width/4 * (this.appIndex==1 ? 1 : 3), b.centerY() + 200);
            log("选择第 %s 个%s", this.appIndex, appName);
            sleep(1000);
        }
        // 避开使用 currentPackage，该方法有误识别
        while (!(findOneByStr("小金库", 200) && findOneByStr("白条", 200) && findOneByStr("金条", 200) && findOneByStr("保险", 200) && findOneByStr("每日签到", 200))) {
            logger.log("等待App被唤起...");
            sleep(2000);
        }
        logger.log("App已启动");
        logger.log("完成");
    }
    // 在【首页】标签页，打开签到页面
    this.openSignPage = function() {
        const logger = new Logger('打开签到页面');
        // 进入【首页】的页面
        // let myBtn = id('iv_first_icon').findOne();
        // let btn = id("firstLayout").findOne();
        // btn.click();
        // logger.log("点击【首页】标签页完成");
        // sleep(1000);
        // 往上滑动，使每日签到按钮避开悬浮广告按钮
        swipe(device.width/2, device.height/2, device.width/2, device.height/2 - 200, 800);
        btn = findOneByStr("每日签到");
        let b = btn.bounds();
        click(b.centerX(), b.centerY());
        logger.log("点击按钮");
        // 等待页面加载完
        waitForSignPageLoaded(logger);
        return true;
    }
    // 签到
    this.sign = function() {
        const logger = new Logger('京东金融签到');        
        waitForSignPageLoaded(logger);
        let btn = null;
        btn = findOneByStrStartsWith("签到领钢镚", 1000);
        if (btn) {
            btn.click();
            // 等待签到成功
            btn = findOneByStr("签到成功");
            logger.log("签到成功");
            this.backPage(logger);
            waitForSignPageLoaded(logger);
            return true;
        } else {
            btn = findOneByStrStartsWith("已连续签到", 1000);
            if (btn) {
                logger.log("已签到");
                return true;
            } else {
                logger.log("未找到签到按钮");
                return false;
            }
        }
    }
    // 领取签到京东豆
    this.getSignBean = function(name) {
        const logger = new Logger(name);
        waitForSignPageLoaded(logger);
        let gif = getSignPageWelfare(name);
        if (!gif) {
            logger.log("没找到任务");
            return;
        } else if (gif[1].text() == "暂无" || gif[1].desc() == "暂无") {
            logger.log("已完成")
        } else {
            gif[1].click();
            findOneByStr("分期免息");
            logger.log("加载完成");
            // 等待执行完成，返回
            sleep(60000 + 2500);
            logger.log("完成");
            back();
            sleep(1000);
        }
    }
    // 签到页面福利点击
    function getSignPageWelfare(str) {
        // 待领取福利中，四个uiObject是一个按钮入口，只有后三个uiObject有效
        let btnGroup = findOneByStr(str, 5000).parent().children();
        if (!btnGroup) {
            return null;
        }
        let index = -1;
        for (let i = 0; i < btnGroup.length; i++) {
            if (btnGroup[i].text() == str || btnGroup[i].desc() == str) {
                index = i;
                break;
            }
        }
        return [btnGroup[index], btnGroup[index+1], btnGroup[index+2], btnGroup[index+3]];
    }
    // 打开赚钱页面
    this.openMakeMoneyPage = function() {
        const logger = new Logger("打开赚钱页面");
        let btnGroup = getSignPageWelfare("每日赚京豆");
        btnGroup[1].click();
        logger.log("点击");
        // 等待加载完成
        waitForMakeMoneyPageLoaded(logger);
        logger.log("完成");
    }
    // 赚钱页面-签到
    this.makeMoneySign = function() {
        const logger = new Logger("赚钱签到");
        waitForMakeMoneyPageLoaded(logger);
        findOneByStr("今天", 4000);
        let btn = findOneByStr("可领", 3000);
        if (btn) {
            btn.click();
            sleep(2000);
            logger.log("领取京豆，完成");
            // 再次点击退出弹窗
            freshPage(logger);
            waitForMakeMoneyPageLoaded(logger);
        } else {
            logger.log("已完成");
        }
    }
    // 赚钱页面-领京豆
    this.getMakeMoneyBean = function(taskName, entryBtn) {
        const logger = new Logger(taskName);
        waitForMakeMoneyPageLoaded(logger);
        let btn = findOneByStr("赚京豆");
        let b = btn.bounds();
        if (b.top > 240) {
            swipe(device.width/2, b.top, device.width/2, 0, 1000);
            logger.log("滑动页面");
        }
        let tryTime = 4;
        let count = 0;
        let res = false;
        while (!res && (count++ < tryTime)) {
            let entry = findOneByStr(entryBtn, 5000);
            if (!entry) {
                logger.log("不存在任务");
                break;
            }
            // 判断是否完成  
            let isOver = entry.parent().parent().children().filter((iitem) => {
                if (iitem.text() == "领取奖励" || iitem.desc() == "领取奖励") {
                    // 如果已完成未领取奖励，直接领取
                    b = iitem.bounds();
                    click(b.centerX(), b.centerY());
                    logger.log("领取京豆");
                    sleep(1000);
                    return true;
                }
                return ("今日已领完" == iitem.desc() || "已完成" == iitem.desc() || "今日已领完" == iitem.text() || "已完成" == iitem.text());
            });
            if (isOver.length > 0) {
                logger.log("已完成");
                break;
            }
            logger.log("第 " + count + " 次执行");
            res = this.getMoreBeanTask(entryBtn, logger);
            freshPage(logger);
            waitForMakeMoneyPageLoaded(logger);
        }
        return res;
    }
    // 赚更多京豆具体任务
    // 返回 true: 任务完成； false： 任务未完成
    this.getMoreBeanTask = function(entryBtn, logger) {
        btn = findOneByStr(entryBtn);
        btn.click();
        logger.log("点击");
        // 确认有页面跳转
        findOneByStr("精选") && findOneByStr("分期免息") && findOneByStr("众筹") && findOneByStr("9块9") && findOneByStr("购就返");
        logger.log("页面已跳转");
        // 等待页面加载完成
        let res = findOneByStrStartsWith("浏览页面", 5000);
        logger.log("开始浏览");
        // 如果出现 浏览页面，表示当前有任务倒计时
        if (!res) {
            logger.log("未找到任务浏览提示，继续执行");
        }
        // 等待完成任务按钮出现
        logger.log("等待30秒...")
        sleep(30000);
        // 如果30秒后，或60秒后
        // 未完成： 【浏览页面%d秒，完成任务1/3】 
        // 已完成： 【浏览完成，京豆+1】
        let finishBtn = descContains("完成任务") || textContains("完成任务");
        let overBtn = descStartsWith("浏览完成") ||　textStartsWith("浏览完成");
        res = false;
        if (finishBtn.exists()) {
            logger.log(btn.desc() || btn.text());
            res = false;
        } else if(overBtn.exists()) {
            let receiveBtn = findOneByStr("领取");
            receiveBtn.click();
            logger.log("领取京豆");
            sleep(1000);
            logger.log("完成");
            res = true;
        } else {
            logger.log("任务未完成，继续等待30秒...")
            // 如果没有对应完成字眼出现，则继续等30秒
            sleep(30000);
            finishBtn = descContains("完成任务") || textContains("完成任务");
            overBtn = descStartsWith("浏览完成") || textStartsWith("浏览完成");
            if (finishBtn.exists()) {
                logger.log(finishBtn.findOne().desc() || finishBtn.findOne().text());
                res = false;
            } else if (overBtn.exists()) {
                let receiveBtn = findOneByStr("领取");
                receiveBtn.click();
                logger.log("领取京豆");
                sleep(1000);
                logger.log("完成");
                res = true;
            }
            logger.log("未知任务进度");
            res = false;
        }
        this.backPage(logger);
        // 等待加载完成
        waitForMakeMoneyPageLoaded(logger);
        return res;
    }
    /** 获取游戏签到京豆 */
    this.getGameSignBean = function() {
        const logger = new Logger("游戏赚豆");
        let btn = findOneByStr('游戏赚豆', 2000);
        if (!btn) {
            logger.log('未找到入口');
            return false;
        }
        let b = btn.bounds();
        click(b.centerX(), b.centerY());
        logger.log('点击进入');
        sleep(1000);
        // 刷新页面跳过弹出的广告
        freshPage(logger);
        btn = findOneByStr('每日签到赚京豆', 3000);
        if (!btn) {
            logger.log('没有找到签到入口1');
            this.backPage(logger);
            return false;
        }
        btn = btn.parent().children()[2];
        if (!btn) {
            logger.log('没有找到签到入口2');
            this.backPage(logger);
            return false;
        }
        btn.click();
        btn = findOneByStr('yesbtn', 2000);
        if (btn) {
            logger.log('已签到');
            this.backPage(logger);
            this.backPage(logger);
            return true;
        }
        btn = findOneByStr('nobtn', 2000);
        if (!btn) {
            logger.log('没有找到签到按钮');
            return false;
        }
        btn.click();
        sleep(1000);
        this.backPage(logger);
        this.backPage(logger);
    }
}


auto.waitFor();
setScreenMetrics(device.width, device.height);
console.setSize(1000, 1000);
useFloatyWinLogger = false; // 是否使用悬浮框显示日志
// console.show(); // 使用默认控制台显示日志

// 没有双开启动
let jdjr = new Jdjr();
jdjr.start();

// 双开启动
// let jdjr1 = new Jdjr(1);
// jdjr1.start();
// sleep(1000); // 这里不睡眠，会诡异唤起 NFC 公交卡
// let jdjr2 = new Jdjr(2);
// jdjr2.start();
exit();
